//
// Created by nilyang on 2021/11/25.
//

#ifndef BASIC_COPYELISION_H
#define BASIC_COPYELISION_H
#include <cstddef>
#include <iostream>

class CopyElision {
    char *bucket;
    size_t bucketSize;
public:
    explicit CopyElision(const char *str);

    CopyElision(const CopyElision &d);

    ~CopyElision();
    std::size_t GetLen() const;
private:
    std::size_t Len(const char* str) const;
    std::size_t Len(char* str) const {
        return Len(static_cast<const char*>(str));
    }
};

/// Copy Elision(拷贝省略）
/// C++ Copy Elision https://www.jianshu.com/p/8c15d1a1e6fb

/// 具名返回值优化 NRVO （Named Return Value Optimization，NRVO）

/// NRVO (named-return value optimization)
/// 返回值优化 RVO（Return Value Optimization，RVO），即避免返回过程触发复制 / 移动构造函数。
///  二者的区别在于返回值是具名的局部变量（NRVO）还是无名的临时对象（URVO）
///        还有一种优化就是URVO(unnamed-return value optimization)
/// 根据返回的值是否是匿名对象，可以分为两类：
/// 具名返回值优化 (NRVO) 和 匿名返回值优化 (URVO)
CopyElision func_GetCopyElision_NRVO(const char* str);

/// 匿名返回值优化 URVO（Unknown Return Value Optimization，URVO ）
CopyElision func_GetCopyElision_URVO(const char* str);

void func_cpp_elision();



#endif //BASIC_COPYELISION_H
